package main

import (
	"fmt"
	"sync"
)

// main
//
//	@Description: 使用 Mutex 实现一个线程安全的队列
func main() {
	var wg sync.WaitGroup
	queue := NewSliceQueue(10)
	for i := 0; i < 10000; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			queue.Enqueue(i)
			v := queue.Dequeue()
			fmt.Println("i=", i, "v=", v)

		}(i)
	}
	wg.Wait()
	fmt.Println("over")

}

type SliceQueue struct {
	sync.Mutex
	data []interface{}
}

func NewSliceQueue(n int) *SliceQueue {
	return &SliceQueue{
		data: make([]interface{}, n),
	}
}

// Enqueue
//
//	@Description: Enqueue 把值放在队尾
//	@receiver q
//	@param v
func (q *SliceQueue) Enqueue(v interface{}) {
	q.Lock()
	defer q.Unlock()
	q.data = append(q.data, v)
}

// Dequeue
//
//	@Description: Dequeue 移去队头并返回
//	@receiver q
//	@return interface{}
func (q *SliceQueue) Dequeue() interface{} {
	q.Lock()
	defer q.Unlock()
	v := q.data[0]
	//将index=1至末尾的重新赋值给data
	q.data = q.data[1:]
	return v
}
